package com.up4years.dataapi.dao.base;

import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.apache.commons.beanutils.PropertyUtils;
import org.apache.ibatis.session.SqlSessionFactory;
import org.mybatis.spring.support.SqlSessionDaoSupport;
import org.springframework.stereotype.Repository;

import com.up4years.dataapi.entity.base.Page;
/**
 * 数据库级查询
 * 
 * @author xuxingan
 *
 */
@Repository
@Deprecated
public class BaseDao extends SqlSessionDaoSupport {
	
	@Resource
	@Override
	public void setSqlSessionFactory(SqlSessionFactory sqlSessionFactory) {
		// TODO Auto-generated method stub
		super.setSqlSessionFactory(sqlSessionFactory);
	}

	/**
	 * 新增
	 * 
	 * @param entity 实体
	 * @return 返回受影响的行数
	 */
	public <T> int insertRow(T entity) {
		return getSqlSession().insert(entity.getClass().getSimpleName() + ".insert", entity);
	}

	public <T> int insertRow(String statementName, T entity) {
		return getSqlSession().insert(statementName, entity);
	}

	/**
	 * 批量新增
	 * 
	 * @param entities 实体集
	 * @return 返回受影响的行数
	 */
	public <T> int insertRows(List<T> entities) {
		return getSqlSession().insert(entities.get(0).getClass().getSimpleName() + ".batchInsert", entities);
	}

	public <T> int insertRows(String statementName, List<T> entities) {
		return getSqlSession().insert(statementName, entities);
	}

	/**
	 * 删除
	 * 
	 * @param entity 实体
	 * @return 返回受影响的行数
	 */
	public <T> int deleteRow(Class<T> entity, Map<String, Object> parameters) {
		try {
			return getSqlSession().update(entity.getSimpleName() + ".delete", parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	/**
	 * 删除
	 * 
	 * @param entity 实体
	 * @return 返回受影响的行数
	 */
	public <T> int deleteNoRow(Class<T> entity, Map<String, Object> parameters) {
		return getSqlSession().update(entity.getSimpleName() + ".delete", parameters);
	}

	public <T> int deleteRow(String statementName, Map<String, Object> parameters) {
		try {
			return getSqlSession().delete(statementName, parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	public <T> int deleteNoRow(String statementName, Map<String, Object> parameters) {
		return getSqlSession().delete(statementName, parameters);
	}

	public <T> int deleteRow(String statementName, T entity) {
		return getSqlSession().delete(statementName, entity);
	}
	
	
	/**
	 * 更新
	 * 
	 * @param entity 实体
	 * @return 返回受影响的行数
	 */
	public <T> int updateRow(T entity) {
		return getSqlSession().update(entity.getClass().getSimpleName() + ".update", entity);
	}

	public int updateRow(String statementName, Map<String, Object> parameters) {
		try {
			return getSqlSession().update(statementName, parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	public <T> int updateRow(String statementName, T entity) {
		return getSqlSession().update(statementName, entity);
	}
	
	public int updateNoRow(String statementName, Map<String, Object> parameters) {
		return getSqlSession().update(statementName, parameters);
	}

	/**
	 * 根据实体标识查询
	 * 
	 * @param entity 实体
	 * @return 实体
	 */
	@SuppressWarnings("unchecked")
	public <T> T getRow(Class<T> entity, Map<String, Object> parameters) {
		try {
			return (T) getSqlSession().selectOne(entity.getSimpleName() + ".get", parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	/**
	 * 根据实体标识查询
	 * 
	 * @param entity 实体
	 * @return 实体
	 */
	@SuppressWarnings("unchecked")
	public <T> T getNoRow(Class<T> entity, Map<String, Object> parameters) {
		return (T) getSqlSession().selectOne(entity.getSimpleName() + ".get", parameters);
	}

	@SuppressWarnings("unchecked")
	public <T> T getRow(String statementName, Map<String, Object> parameters) {
		try {
			return (T) getSqlSession().selectOne(statementName, parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	@SuppressWarnings("unchecked")
	public <T> T getNoRow(String statementName, Map<String, Object> parameters) {
		return (T) getSqlSession().selectOne(statementName, parameters);
	}

	/**
	 * 根据实体标识查询
	 * 
	 * @param entity 实体
	 * @return 实体
	 */
	@SuppressWarnings("unchecked")
	public <T> T get(Class<T> entity, Long id) {
		return (T) getSqlSession().selectOne(entity.getSimpleName() + ".get", id);
	}
	
	@SuppressWarnings("unchecked")
	public <T> T getRow(String statementName, Long id) {
		return (T) getSqlSession().selectOne(statementName ,id);
	}

	/**
	 * 查询实体集
	 * 
	 * @param entity 实体
	 * @return 实体集
	 */
	public <T> List<T> queryRows(Class<T> entity, Map<String, Object> parameters) {
		try {
			return getSqlSession().selectList(entity.getSimpleName() + ".query", parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}
	/**
	 * 查询实体集
	 * 
	 * @param entity 实体
	 * @return 实体集
	 */
	public <T> List<T> queryRows(String statementName, String parameter) {
		try {
			return getSqlSession().selectList(statementName, parameter);
		} finally {
			if(parameter!=null){
				parameter = null;
			}
		}
	}

	/**
	 * 查询实体集
	 * 
	 * @param entity 实体
	 * @return 实体集
	 */
	public <T> List<T> queryNoRows(Class<T> entity, Map<String, Object> parameters) {
		return getSqlSession().selectList(entity.getSimpleName() + ".query", parameters);
	}

	public <T> List<T> queryRows(String statementName, Map<String, Object> parameters) {
		try {
			return getSqlSession().selectList(statementName, parameters);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}
	/**
	 * 分页
	 * @param page
	 * @param statementName
	 * @param parameter
	 * @return
	 */
	public <T> Page<T> selectPage(Page<T> page, String statementName, Object parameter) {
		String countStatementName = statementName + "Count";
		return selectPage(page, statementName, countStatementName, parameter);
	}

	/**
	 * 分页
	 * @param page
	 * @param statementName 查询集合名称
	 * @param countStatementName 统计名称
	 * @param parameter
	 * @return
	 */
	public <T> Page<T> selectPage(Page<T> page, String listStatementName, String countStatementName, Object parameter) {

		Number totalItems = (Number) getSqlSession().selectOne(countStatementName, parameter);
		if (totalItems != null && totalItems.longValue() > 0) {
            int totalCount = totalItems.intValue();
			page.setTotalItems(totalCount);
			List<T> list = getSqlSession().selectList(listStatementName, toParameterMap(parameter, page));
			page.setResult(list);
		}
		return page;
	}
	public <T> List<T> queryNoRows(String statementName, Map<String, Object> parameters) {
		return getSqlSession().selectList(statementName, parameters);
	}

	/**
	 * 查询返回map
	 * 
	 * @param statementName 命名空间+id
	 * @param parameters 请求参数
	 * @param key 作为主见的key
	 * @return
	 */
	public <T> Map<String, T> queryMapRows(String statementName, Map<String, Object> parameters, String key) {
		try {
			return getSqlSession().selectMap(statementName, parameters, key);
		} finally {
			if(parameters!=null){
				parameters.clear();
				parameters = null;
			}
		}
	}

	/**
	 * 查询返回map
	 * 
	 * @param statementName 命名空间+id
	 * @param parameters 请求参数
	 * @param key 作为主见的key
	 * @return
	 */
	public <T> Map<String, T> queryMapNoRows(String statementName, Map<String, Object> parameters, String key) {
		return getSqlSession().selectMap(statementName, parameters, key);
	}

	public <T> List<T> queryNoClearMapRows(String statementName, Map<String, Object> parameters) {
		return getSqlSession().selectList(statementName, parameters);
	}

	public <T> Map<String, T> queryNoClearMapRows(String statementName, Map<String, Object> parameters, String key) {
		return getSqlSession().selectMap(statementName, parameters, key);
	}
	
	
	protected static Map<String, Object> toParameterMap(Object parameter, @SuppressWarnings("rawtypes") Page p) {
		Map<String, Object> map = toParameterMap(parameter);
		map.put("startRow", p.getStartRow());
		map.put("endRow", p.getEndRow());
		map.put("offset", p.getOffset());
		map.put("limit", p.getPageSize());
		return map;
	}

	@SuppressWarnings("unchecked")
	protected static Map<String, Object> toParameterMap(Object parameter) {
		if (parameter instanceof Map) {
			return (Map<String, Object>) parameter;
		} else {
			try {
				return PropertyUtils.describe(parameter);
			} catch (Exception e) {
				org.springframework.util.ReflectionUtils.handleReflectionException(e);
				return null;
			}
		}
	}
	public <T> List<T> queryRows(String statementName, Object obj) {
		return getSqlSession().selectList(statementName, obj);
	}

}
